package com.berchen.线程调度;

import java.util.concurrent.*;

/**
 * 线程池：提供了一个线程队列，队列中保存着一系列所有等待状态的线程。避免了创建与销毁线程的额外开销。提高了响应的速度。
 * 线程池的体系结构：
 *  java.util.concurrent.Executor：负责线程的使用与调度的根接口。
 *      |--ExecutorService子接口：线程池的主要接口。
 *          |--ThreadPoolExecutor：实现类
 *          |--ScheduledExecutorService子接口：负责线程的调度的子接口。
 *              |--ScheduledThreadPoolExecutor实现类：继承了ThreadPoolExecutor同时实现了ScheduledExecutorService接口。
 * 工具类：Executors
 * ExecutorService newFixedThreadPool()：创建固定大小的线程池。
 * ExecutorService newCachedThreadPool()：缓存线程池，线程池的数量不固定，可以根据需求自动的更新数量。
 * ExecutorService newSingleThreadExecutor()：创建单个线程池（线程池中只有一个线程）。
 *
 * ScheduledExecutorService newScheduledThreadPool()：创建固定大小的线程池。可以延迟或定时的执行任务。
 */
public class TestScheduledThreadPool {

    public static void main(String[] args) throws ExecutionException, InterruptedException {

        ScheduledExecutorService pool = Executors.newScheduledThreadPool(5);

        Future<Integer> schedule = pool.schedule(new Callable<Integer>() {
            @Override
            public Integer call() throws Exception {

                System.out.println(Thread.currentThread().getName());
                return 1;
            }
        }, 3, TimeUnit.SECONDS);// 第一个参数，就是接口，第二个参数是数量（延迟多久执行的数量），第三个参数是第二个的单位（时分秒。。。等等）。

        Integer result = schedule.get();
        System.out.println("结果："+result);

        pool.shutdown();    // 平和的关闭线程池
    }
}
